/*!
 * @brief modeWorld.hh
 * @brief Obiekt do renderowania mapy świata
 */

#ifndef __MODES_WORLD_MODEWORLD_HH
#define __MODES_WORLD_MODEWORLD_HH

#include <GL/glew.h>
#include <cmath>
#include <fstream>
#include "engine/modeBase.hh"
#include "engine/basic/point2f.hh"
#include "engine/basic/point3f.hh"
#include "engine/basic/inifile.hh"

#include "modes/world/area/areaMenager.hh"
#include "modes/world/skybox/skyboxMenager.hh"
#include "modes/world/water/waterMenager.hh"

enum rotateRenderArg {rra_normal, rra_flip};

/*!
 * @brief Obiekt do renderowania świata
 */
class modeWorld: public modeBase {
public:
	/*!
	 * @brief Konstruktor
	 * @return Obiekt
	 */
	modeWorld();

	/*Interfejs modeBase*/
	void render2d();
	void render3d();
	void calculate();
	void input();
	void init();

	/*!
	 * @brief Wczytywanie mapy
	 * @param path Adres folderu z mapą
	 */
	void loadMap(std::string path);

	/*!
	 * @brief zarządca terenów
	 */
	areaMenager *_area;

	/*!
	 * @brief zarządca skyboxów
	 */
	skyboxMenager *_skybox;

	/*!
	 * @brief zarządca wody
	 */
	waterMenager *_water;

	/*!
	 * @brief Plik z konfiguracją mapy
	 */
	inifile *config;

private:
	void rotateRender(rotateRenderArg arg);

	/*!
	 * @brief adres do folderu z mapą
	 */
	std::string mapPath;

	/*!
	 * @brief nazwa mapy
	 */
	std::string mapName;

	texture *screen;
	shader *godraysShader;
};

#else
class modeWorld;
#endif
